'''
1、常用函数与运算符
    1.1运算符
        算术运算符：
            +: select (1+2) as sum
            -:select (1-2) as sub
            *:select (1*2) as multi
            \:select (1/2) as division
        比较运算符：
            =:select * from table_date where day=26
            !=:select * from table_date where day!=26
            >=:select * from table_date where day>=26
            <=:select * from table_date where day<=26
            between:select * from table_date where day between 20 and 26
        逻辑运算符：
            not：select * from table_date where not month=10
            and:select * from table_date where month=10 and day=30
            or:select * from table_date where month=10 or day=30
            #异或, 两个值一个为true, 一个为false时候返回结果true
            xor:select * from table_date where month=10 xor day=30
    1.2、函数：
        算数运算：
            sum:select sum(day)as sum_result from table_date
            avg:select avg(day)as avg_result from table_date
            count:select count(day) from table_date
            #max、min按字符ascii码进行排序
            max:select max(day) from table_date
            min:select min(day) from table_date
        字符处理：
            char_length:select char_length  ("year")
            #format限定小数遵循四舍五入
            format:select format(0.6666,3)
            format:select format(0.2222,3)
            trim:select trim("   year   ")
            left:select * from table_date where left(month, 1)="1"
            right:select * from table_date where right(month, 1)="2"
2、数据类型
    int:数字范围：-2**31~2**31-1
    bigint:数字范围：-2**63~2**63-1
    float/double/decimal：浮点数通过二进制表现，计算机背后使用的也是二进制；decimal存的是字符串, 以10进制计算;
        INSERT INTO table_date(double_test,float_test, decimal_test) values(0.66, 0.66, 0.66);
        SELECT double_test*10,float_test*10, decimal_test*10 from table_date_copy1
    char:字符串
    varchar:可变字符串，比char节约空间
    text:长文本类型
    longtext:极大文本类型
3、分组
    select 字段a, 函数(字段b) from 表名 group 字段
        select month,sum(day) from table_date group by month
4、索引
    创建索引：
        create index index_month on table_date(month)
    创建联合索引：
        creat index 索引名 on 表名 （字段1，字段2.....)
        create index month_day_index on table_date(month,day)
    查看索引：
        show index from table_date
    删除索引：
        alter  table table_date drop index month_index
    查看索引是否被命中：
        explain select * from  table_date where month="11"
    索引的原理：B+树，是一种特殊链表，实现二分查找算法
    ***************************************************************************
    左缀查询：创建索引字段应该与查询语句中字段从左向右对齐（两个字段时可以颠倒）
        #创建两个字段联合索引
        create index month_day_index on table_date(month,day)
        # 以下均可以命中索引
        explain select * from  table_date where month="11" and day="18";
        explain select * from  table_date where day="18" and month="11"

        #创建三个字段联合索引
        create index year_month_day_index on table_date(year,month,day)
        #以下均可以命中索引
        #严格来说如果不按创建索引时字段的顺序，查询是不走联合索引的，只是mysql查询优化器把它优化成索引可以识别的形式了，
        #所以实际运行发现它也走了索引
        explain select * from  table_date where year="2020" and month="11" and day="18";
        explain select * from  table_date where month="11" and year="2020" and day="18";
        explain select * from  table_date where day="18" and month="11" and year="2020" ;
        explain select * from  table_date where year="2020" and month="11";
        explain select * from  table_date where month="11" and year="2020"
        #以下无法命中索引
        explain select * from  table_date where month="11" and day="18"
        explain select * from  table_date where day="18" and month="11"
**********************************************************************************
    如何优化Mysql?
        合理建立索引：
            频繁作为查询条件的字段应建立索引
            唯一性太差的字段不适合建立索引
            频繁更新的字段不适合建立索引
            避免不经过索引的操作
                not in ,!=逻辑取反
                between范围查询
                or两边字段必须都命中才会走索引
'''



